package com.wangqingbo.myspringbootproject.service.impl;

import com.wangqingbo.myspringbootproject.dao.ProjectInfoMapper;
import com.wangqingbo.myspringbootproject.dao.SysFileInfoMapper;
import com.wangqingbo.myspringbootproject.entity.ProjectInfo;
import com.wangqingbo.myspringbootproject.entity.SysFileInfo;
import com.wangqingbo.myspringbootproject.service.ProjectInfoService;
import com.wangqingbo.myspringbootproject.utils.PageView;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * 项目业务操作实现类
 */
@Service
public class ProjectInfoServiceImpl implements ProjectInfoService {

    // 附件存放目录
    @Value("${file.savePath}")
    private String saveFilePath;
    // 定义一个mapper接口
    @Autowired
    private ProjectInfoMapper projectInfoMapper;
    @Autowired
    private SysFileInfoMapper fileInfoMapper;
    @Override
    public int saveProjectInfo(ProjectInfo prj) {
        return 0;
    }

    @Override
    public ProjectInfo getProjectInfoById(String projectId) {
        return null;
    }

    @Override
    public int updateProjectInfo(ProjectInfo prj) {
        return 0;
    }

    @Override
    public int delProjectInfoById(String projectId) {
        return 0;
    }

    @Override
    public List<ProjectInfo> getAllProjectInfo() {
        // 调用mapper的方法，查询所有的项目信息
        List<ProjectInfo> allProjectInfo = projectInfoMapper.getAllProjectInfo();
        if (allProjectInfo != null && allProjectInfo.size() > 0)
        {
            for(ProjectInfo prj : allProjectInfo)
            {
                prj.setProjectName(prj.getProjectName() + "项目");
            }
        }
        return allProjectInfo;
    }

    /**
     * 根据参数查询项目信息，并且要分页
     * @param projectName 项目名称
     * @param projectCode 项目编码
     * @param currentPage 当前页，用于分页
     * @param pageSize 每页显示的数据条数，用于分页
     * @return 项目信息，包含列表和分页
     */
    public Map<String,Object> getProjectInfoByParamsPage(String projectName, String projectCode, int currentPage, int pageSize)
    {
        Map<String,Object> map = new HashMap<>();
        // 判断参数是否为空，不为空时，要前后加%%，用于模糊查询
        if (projectName != null && !"".equals(projectName))
        {
            projectName = "%" + projectName + "%";
        }
        if (projectCode != null && !"".equals(projectCode))
        {
            projectCode = "%" + projectCode + "%";
        }
        // 计算offset
        int offset = (currentPage - 1) * pageSize;
        // 查询数据列表
        List<ProjectInfo> list = projectInfoMapper.getProjectInfoByParamsPage(projectName,projectCode,offset,pageSize);
        // 将数据列表放入map
        map.put("list",list);
        // todo 计算分页信息  11 10 Math.ceil
        // 查询总记录数
        int recordCount = projectInfoMapper.getProjectInfoCountByParamsPage(projectName,projectCode);
        // 计算分页信息
        PageView pageView = new PageView(pageSize,currentPage,recordCount);
        // 将分页信息放入map
        map.put("pageView",pageView);
        return map;
    }

    /**
     * 保存附件信息
     * @param projectId 项目id
     * @param myFile 附件实体
     * @return 成功的数据
     */
    @Transactional
    public int saveFile(String projectId, MultipartFile myFile)
    {
        // 把附件存放到制定的目录
        // 附件的原始名称
        String originalFilename = myFile.getOriginalFilename();
        // 文件的后缀名
        String suffix = "";
        if (originalFilename != null && !"".equals(originalFilename))
        {
            suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        }

        // 附件的保存名称
        String saveFileName = UUID.randomUUID().toString().replaceAll("-", "");
        // 文件的保存路径 saveFilePath
        // 创建一个新文件
        File file = new File(saveFilePath,saveFileName + suffix);
        // 判定文件目录是否存在
        if (!file.getParentFile().exists())
        {
            // 创建目录
            file.getParentFile().mkdir();
        }
        //  把附件保存到文件夹
        try {
            myFile.transferTo(file);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        // 把附件的信息存入数据库
        SysFileInfo fileInfo = new SysFileInfo();
        // 设置其他的属性值
        fileInfo.setFilePath(saveFilePath);
        // 附件的原始名称
        fileInfo.setOriginalName(originalFilename);
        // 附件的存储文件名
        fileInfo.setFileSaveName(saveFileName + suffix);
        // 附件的后缀名
        fileInfo.setSuffix(suffix);
        // 附件类型
        fileInfo.setFileType(myFile.getContentType());
        // 附件大小
        fileInfo.setFileSize(new BigDecimal(myFile.getSize()));
        // 项目id
        fileInfo.setModuleId(projectId);
        // 保存数据到数据库
        int num = fileInfoMapper.saveFileInfo(fileInfo);
        return num;
    }
}
